/*
 *  \file Session.h
 *  gre
 *
 *  Created by Kutlak Roman on 15/04/2012.
 *  Copyright 2012 Kutlak Roman. All rights reserved.
 *
 */

#ifndef Session_h 
#define Session_h

#include "Utilities.h"
#include "Voc.h"
#include "Ontology.h"
#include "KnowledgeBase.h"

namespace kutlak {
namespace roman {
namespace gre {
    
    /*!
     * \brief A one line description of the class. 
     * 
     * #include "XX.h" <BR> 
     * -llib 
     * 
     * A longer description. 
     * 
     * @see something 
     */
    class Session { 
    public: 
#pragma mark -
#pragma mark lifecycle
        Session(pKnowledgeBase kb = pKnowledgeBase(),
                pOntology onto = pOntology());
        
        Session(const Session& from);

        Session& operator=(Session from) noexcept(true);
        
        friend void swap(Session& lhs, Session& rhs) noexcept(true);
        
        ~Session(void) noexcept(true);
        
#pragma mark -
#pragma mark I/O
        
         friend std::ostream& operator<<(std::ostream& out, const Session& obj);
         
         void Serialise(std::ostream& out) const;
         
         friend std::istream& operator>>(std::istream& input, Session& obj);

         void Deserialise(std::istream& in);
        
#pragma mark -
#pragma mark access
        Voc& Vocab() const
        { return mVoc; }
        
        pKnowledgeBase KnowledgeBase() const
        { return mpKb; }
        
        pOntology Ontology() const
        { return mpOnto; }
        
    private:
        Voc& mVoc;
        pKnowledgeBase mpKb;
        pOntology mpOnto;
    };
    
} // gre
} // roman
} // kutlak
#endif // Session_h
